/**
 * 
 */
package cl.duocap.refaxion.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import cl.duocap.refaxion.dto.MarcaDTO;
import cl.duocap.refaxion.dto.ModeloDTO;
import cl.duocap.refaxion.dto.UsuarioDTO;
import cl.duocap.refaxion.dto.VehiculoDTO;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * @author rentonx
 *
 */
public class VehiculoDAO {

	/**
	 * 
	 */
	private Connection conexion;
	
	
	
	public List<VehiculoDTO> obtenerTodosVehiculos() {
		
		List<VehiculoDTO> listaVehiculos = new ArrayList<VehiculoDTO>();
		MarcaDTO marcaVehiculo = new MarcaDTO();
        ResultSet rs= null;
        
		try {

			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionVehiculosIngresados()}");
			rs = cstmt.executeQuery();
			
			 while (rs.next()){
                 
				    VehiculoDTO vehiculo = new VehiculoDTO();
				    vehiculo.setIdVehiculo(rs.getInt("idVehiculo"));
				    vehiculo.setMatricula(rs.getString("matricula"));
				    vehiculo.setCliente(rs.getString("cliente"));
				    vehiculo.setIdMarca(rs.getInt("idMarca"));
				    vehiculo.setMarcaDescripcion(rs.getString("marcaDescripcion"));
				    vehiculo.setIdModelo(rs.getInt("idModelo"));
				    vehiculo.setModeloDescripcion(rs.getString("modeloDescripcion"));
				    vehiculo.setColor(rs.getString("color"));
				    vehiculo.setFechaIngreso(rs.getString("fechaIngreso"));
				    vehiculo.setKilometraje(rs.getInt("kilometraje"));
				    vehiculo.setVin(rs.getString("vin"));
				    vehiculo.setEstado(rs.getInt("estado"));   
				    marcaVehiculo.setIdMarca(rs.getInt("idMarca"));
				    marcaVehiculo.setMarcaDescripcion(rs.getString("marcaDescripcion"));			    
				    vehiculo.setMarcaVehiculo(marcaVehiculo);

	            	listaVehiculos.add(vehiculo);
	            	
	          }

	        } catch (SQLException ex) {
	             throw new RuntimeException("listar Vehiculos ingresados.",ex);                    
	        }finally {
	             try{
	                rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		
		return listaVehiculos;
	
	}
	
	
	public boolean registrarVehiculoNuevo(VehiculoDTO vehiculoNuevo, UsuarioDTO clienteSeleccionadoVehiculo){
		
		try {
			
		
				CallableStatement cstmt = conexion.prepareCall("{ call paInsRefaxionRegistrarVehiculo(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
		
				int i = 1;
				
				cstmt.setString(i++,vehiculoNuevo.getMatricula());
				cstmt.setInt(i++,vehiculoNuevo.getIdModelo());
				cstmt.setString(i++,vehiculoNuevo.getColor());
				cstmt.setString(i++,vehiculoNuevo.getFechaIngreso());
				cstmt.setInt(i++,vehiculoNuevo.getAnno());
				cstmt.setString(i++,vehiculoNuevo.getTipoTransmision());
				cstmt.setInt(i++,vehiculoNuevo.getKilometraje());
				cstmt.setString(i++,vehiculoNuevo.getVin());
				cstmt.setString(i++,vehiculoNuevo.getCombustible());
				if(vehiculoNuevo.getGata().equals("1")){
					cstmt.setInt(i++, 1);
				}else{
					cstmt.setInt(i++, 2);
				}
				if(vehiculoNuevo.getRadio().equals("1")){
					cstmt.setInt(i++, 1);
				}else{
					cstmt.setInt(i++, 2);
				}
				if(vehiculoNuevo.getRuedaRepuesto().equals("1")){
					cstmt.setInt(i++, 1);
				}else{
					cstmt.setInt(i++, 2);
				}
				if(vehiculoNuevo.getExtintor().equals("1")){
					cstmt.setInt(i++, 1);
				}else{
					cstmt.setInt(i++, 2);
				}
				if(vehiculoNuevo.getBotiquin().equals("1")){
					cstmt.setInt(i++, 1);
				}else{
					cstmt.setInt(i++, 2);
				}
				if(vehiculoNuevo.getTriangulos().equals("1")){
					cstmt.setInt(i++, 1);
				}else{
					cstmt.setInt(i++, 2);
				}
				cstmt.setString(i++,vehiculoNuevo.getObservacion());
				cstmt.setInt(i++, 1);
				cstmt.setInt(i++, clienteSeleccionadoVehiculo.getIdUsuario());
				
				
		
				cstmt.executeUpdate();
				cstmt.close();
				
				return true;
				
		
		
		 } catch (SQLException ex) {
             throw new RuntimeException("DAO Vehiculo: registrar Vehiculo Nuevo.",ex);     
            
        }finally {
             try{
            	 conexion.close();
            }catch (Exception ex){
                
            }
            try{
                conexion.close();
            }catch (Exception ex){
            	 return false;
            }
            
        }
		
	}
	
	
	public List<MarcaDTO> listarMarcasVehiculo(){
		
		List<MarcaDTO> listaMarcas = new ArrayList<MarcaDTO>();
        ResultSet rs= null;
        
		try {

			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionMarcasVehiculos()}");
			rs = cstmt.executeQuery();
			
			 while (rs.next()){
                 
				    MarcaDTO marca = new MarcaDTO();
				    marca.setIdMarca(rs.getInt("idMarca"));
				    marca.setMarcaDescripcion(rs.getString("marcaDescripcion"));
				    listaMarcas.add(marca);
	            	
	          }

	        } catch (SQLException ex) {
	             throw new RuntimeException("listar marca de Vehiculos.",ex);                    
	        }finally {
	             try{
	                rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		
		return listaMarcas;
	}

	
	public List<ModeloDTO> listarModelosMarcaSeleccionada(int idModelo){
		
		List<ModeloDTO> listaModeloMarcaSeleccionada = new ArrayList<ModeloDTO>();
        ResultSet rs= null;
        
		try {

			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionModelosMarcaSeleccionada(?)}");			
			int i = 1;
			cstmt.setInt(i++,idModelo);
			rs = cstmt.executeQuery();
			 while (rs.next()){
                 
				    ModeloDTO modelo = new ModeloDTO();
				    modelo.setIdModelo(rs.getInt("idModelo"));
				    modelo.setModeloDescripcion(rs.getString("modeloDescripcion"));
				    listaModeloMarcaSeleccionada.add(modelo);
	            	
	          }

	        } catch (SQLException ex) {
	             throw new RuntimeException("listar modelos de marca de Vehiculos selecionada.",ex);                    
	        }finally {
	             try{
	                rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		 
		return listaModeloMarcaSeleccionada;
	}
	
	
	public boolean eliminarVehiculo(int idVehiculo){

		try {
			
			
			CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionEliminarVehiculo(?)}");
			int i=1;
			cstmt.setInt(i++,idVehiculo);
			cstmt.executeUpdate();
			cstmt.close();
			
		 } catch (SQLException ex) {
	         throw new RuntimeException("DAO Vehiculo: error eliminar Vehiculo.",ex);   
	         
	    }finally {
	         try{
	        	 conexion.close();
	        	 return false;
	        }catch (Exception ex){
	            
	        }
	        try{
	        	
	            conexion.close();
	            return false;
	        }catch (Exception ex){
	            
	        }	       
	    }	
		return true;
			
	}
	
	//metodo para extraer datos de vehiculo paraq editar
	public VehiculoDTO traerVehiculoEditar(int idVehiculo) {

		
		   ResultSet rset = null;
		   VehiculoDTO vehiculoEditar = new VehiculoDTO();
		   
			try {
					
					
					CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionTraerVehiculoEditar(?)}");
					
					int i = 1;
					cstmt.setInt(i++,idVehiculo);
					rset = cstmt.executeQuery();
					while (rset.next()) {
						
						
						vehiculoEditar.setMatricula(rset.getString("matricula"));
						vehiculoEditar.setIdModelo(rset.getInt("idModelo"));
						vehiculoEditar.setColor(rset.getString("color"));
						vehiculoEditar.setFechaIngreso(rset.getString("fechaIngreso"));
						vehiculoEditar.setAnno(rset.getInt("anno"));
						vehiculoEditar.setTipoTransmision(rset.getString("tipoTransmision"));
						vehiculoEditar.setKilometraje(rset.getInt("kilometraje"));
						vehiculoEditar.setVin(rset.getString("vin"));
						vehiculoEditar.setCombustible(rset.getString("combustible"));
						vehiculoEditar.setGata(rset.getString("gata"));
						vehiculoEditar.setRadio(rset.getString("radio"));
						vehiculoEditar.setRuedaRepuesto(rset.getString("ruedaRepuesto"));
						vehiculoEditar.setExtintor(rset.getString("extintor"));
						vehiculoEditar.setBotiquin(rset.getString("botiquin"));
						vehiculoEditar.setTriangulos(rset.getString("triangulos"));
						vehiculoEditar.setObservacion(rset.getString("observacion"));
						vehiculoEditar.setEstado(rset.getInt("estado"));
						vehiculoEditar.setIdUsuario(rset.getInt("idUsuario"));

					
					}
					cstmt.close();
				
				
				
			   } catch (SQLException ex) {
				   
			        throw new RuntimeException("error traer usuario editar.",ex);   
			        
				   }finally {
					   
				        try{
				       	 	  conexion.close();
				       	 
				           }catch (Exception ex){
				           
				           }
				           try{
				        		conexion.close();
				           
				        	   }catch (Exception ex){      
				        	   }
			       
				   	}

					 SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
					 String strFecha = vehiculoEditar.getFechaIngreso();
					 Date fecha = null;
					 try {
		
					     fecha = formatoDelTexto.parse(strFecha);
		
					 } catch (ParseException ex) {
		
					     ex.printStackTrace();
		
					 }
			
					 vehiculoEditar.setFechaIngresoTrans(fecha);

			return vehiculoEditar;
		
	
	}
	
	
	public MarcaDTO buscarMarcaVehiculo(int idModelo){
		
		ResultSet rset1 = null;
		MarcaDTO marca = new MarcaDTO();
		
		try {

					//CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionBuscarMarcaVehiculo(?)}");	
					CallableStatement cstmt1 = conexion.prepareCall("{call paConRefaxionBuscarMarcaVehiculo(?)}");
					int i = 1;
					//cstmt1.setInt(i++,idModelo);
					cstmt1.setInt(i++,idModelo);
					rset1 = cstmt1.executeQuery();
					//rset1 = cstmt.executeQuery();
					while (rset1.next()) {				
						marca.setIdMarca(rset1.getInt("idMarca"));
						marca.setMarcaDescripcion(rset1.getString("marcaDescripcion"));
					}
					cstmt1.close();
			
		  } catch (SQLException ex) {
	             throw new RuntimeException("Error DAO vehiculo: buscar marca de Vehiculo.",ex);                    
	        }finally {
	             try{
	            	 rset1.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rset1.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		
		return marca;
		
	}
	
	
	
	public boolean editarVehiculo(VehiculoDTO vehiculoEditar){

		try {

				CallableStatement cstmt = conexion.prepareCall("{ call paUpdRefaxionEditarVehiculo(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
		
				int i = 1;
				
				cstmt.setInt(i++,vehiculoEditar.getIdVehiculo());
				cstmt.setString(i++,vehiculoEditar.getMatricula());
				cstmt.setInt(i++,vehiculoEditar.getIdModelo());
				cstmt.setString(i++,vehiculoEditar.getColor());
				cstmt.setString(i++,vehiculoEditar.getFechaIngreso());
				cstmt.setInt(i++,vehiculoEditar.getAnno());
				cstmt.setString(i++,vehiculoEditar.getTipoTransmision());
				cstmt.setInt(i++,vehiculoEditar.getKilometraje());
				cstmt.setString(i++,vehiculoEditar.getVin());
				cstmt.setString(i++,vehiculoEditar.getCombustible());
				cstmt.setString(i++,vehiculoEditar.getGata());
				cstmt.setString(i++,vehiculoEditar.getRadio());
				cstmt.setString(i++,vehiculoEditar.getRuedaRepuesto());
				cstmt.setString(i++,vehiculoEditar.getExtintor());
				cstmt.setString(i++,vehiculoEditar.getBotiquin());
				cstmt.setString(i++,vehiculoEditar.getTriangulos());
				cstmt.setString(i++,vehiculoEditar.getObservacion());
				cstmt.setInt(i++,vehiculoEditar.getEstado());
				cstmt.setInt(i++,vehiculoEditar.getIdUsuario());
				
				
				cstmt.executeUpdate();
				cstmt.close();
				
		} catch (Exception ex) {
			throw new RuntimeException("error DAOVehiculo: editar vehiculo.",ex); 
		}finally {
			   
	        try{
	       	 	  conexion.close();
	       	 
	           }catch (Exception ex){
	           
	           }
	           try{
	        		conexion.close();
	           
	        	   }catch (Exception ex){      
	        	   }
       
	   	}			
				return true;
		
	}	
	
	
	
	public List<VehiculoDTO> vehiculosAsociadosPorCliente(int idUsuario) {
		
		List<VehiculoDTO> listaVehiculos = new ArrayList<VehiculoDTO>();
		MarcaDTO marcaVehiculo = new MarcaDTO();
        ResultSet rs= null;
        
		try {

			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionVehiculosPorCliente(?)}");
			int i = 1;
			cstmt.setInt(i++,idUsuario);
			rs = cstmt.executeQuery();
			
			 while (rs.next()){
                 
				    VehiculoDTO vehiculo = new VehiculoDTO();
				    vehiculo.setIdVehiculo(rs.getInt("idVehiculo"));
				    vehiculo.setMatricula(rs.getString("matricula"));
				    vehiculo.setCliente(rs.getString("cliente"));
				    vehiculo.setIdMarca(rs.getInt("idMarca"));
				    vehiculo.setMarcaDescripcion(rs.getString("marcaDescripcion"));
				    vehiculo.setIdModelo(rs.getInt("idModelo"));
				    vehiculo.setModeloDescripcion(rs.getString("modeloDescripcion"));
				    vehiculo.setColor(rs.getString("color"));
				    vehiculo.setFechaIngreso(rs.getString("fechaIngreso"));
				    vehiculo.setKilometraje(rs.getInt("kilometraje"));
				    vehiculo.setVin(rs.getString("vin"));
				    vehiculo.setEstado(rs.getInt("estado"));   
				    marcaVehiculo.setIdMarca(rs.getInt("idMarca"));
				    marcaVehiculo.setMarcaDescripcion(rs.getString("marcaDescripcion"));
				    vehiculo.setAnno(rs.getInt("anno"));
//				    if(rs.getString("tipoTransmision").equals("1")){
//				    	vehiculo.setTipoTransmision(rs.getString("Electrica"));
//				    }else{
//				    	vehiculo.setTipoTransmision(rs.getString("Mecanica"));
//				    }
//				    
				    vehiculo.setMarcaVehiculo(marcaVehiculo);

	            	listaVehiculos.add(vehiculo);
	            	
	          }

	        } catch (SQLException ex) {
	             throw new RuntimeException("listar Vehiculos ingresados.",ex);                    
	        }finally {
	             try{
	                rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		
		return listaVehiculos;
	
	}
	
	
	
	public VehiculoDTO buscarVehiculoPorId(int idVehiculo) {
		
		
		MarcaDTO marcaVehiculo = new MarcaDTO();
        ResultSet rs= null;
        VehiculoDTO vehiculo = new VehiculoDTO();
        
		try {

			CallableStatement cstmt = conexion.prepareCall("{ call paConRefaxionVehiculosBuscarPorId(?)}");
			int i = 1;
			cstmt.setInt(i++,idVehiculo);
			rs = cstmt.executeQuery();
			
			 while (rs.next()){
                 
				    
				    vehiculo.setIdVehiculo(rs.getInt("idVehiculo"));
				    vehiculo.setMatricula(rs.getString("matricula"));
				    vehiculo.setCliente(rs.getString("cliente"));
				    vehiculo.setIdMarca(rs.getInt("idMarca"));
				    vehiculo.setMarcaDescripcion(rs.getString("marcaDescripcion"));
				    vehiculo.setIdModelo(rs.getInt("idModelo"));
				    vehiculo.setModeloDescripcion(rs.getString("modeloDescripcion"));
				    vehiculo.setColor(rs.getString("color"));
				    vehiculo.setFechaIngreso(rs.getString("fechaIngreso"));
				    vehiculo.setKilometraje(rs.getInt("kilometraje"));
				    vehiculo.setVin(rs.getString("vin"));
				    vehiculo.setEstado(rs.getInt("estado"));   
				    marcaVehiculo.setIdMarca(rs.getInt("idMarca"));
				    marcaVehiculo.setMarcaDescripcion(rs.getString("marcaDescripcion"));	
				    vehiculo.setAnno(rs.getInt("anno"));
				    vehiculo.setMarcaVehiculo(marcaVehiculo);

	            	
	          }
			 cstmt.close();

	        } catch (SQLException ex) {
	             throw new RuntimeException("buscar Vehiculos por id.",ex);                    
	        }finally {
	             try{
	                rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            try{
	            	rs.close();
	                conexion.close();
	            }catch (Exception ex){
	                
	            }
	            
	        }
		
		return vehiculo;
	
	}
	
	

	public VehiculoDAO() {
		
	}


	public Connection getConexion() {
		return conexion;
	}


	public void setConexion(Connection conexion) {
		this.conexion = conexion;
	}
	
	

}
